// cin.get() cout.put() cin.getline()
// cin.eof() cin.peek() cin.putback() cin.ignore()
// getline
/**
 * 学习链接
 * https://blog.csdn.net/zengcccc/article/details/6938508
 * 第二十一讲：标准输入流
*/
#include <iostream>
// #include <string.h>

int main(void)
{
  char c = '\0';
  // if (EOF)
  // {
  //   std::cout << "EOF is true" << std::endl;
  // }

  // if ('\032' == EOF)
  // {
  //   std::cout << "\\032 == EOF" << std::endl;
  // }
  // else
  // {
  //   std::cout << "\\032 : \032" << std::endl;
  // }

  // std::cout << "enter a sentence:";
  // 输一堆后再键入回车，回车除了输入'\n'还有结束本次输入
  // 直接键入回车，回车除了输入'\n'还有结束本次输入

  // int i = 0;
  char str[100] = "";
  // '032' ^Z
  // while ((c = std::cin.get()) != EOF)
  // while (c = std::cin.get()) // 读到 ^Z进入死循环， unix ^D
  // while (std::cin.get(c)) // 一参数，读取成功返回非0值，读取失败(如遇到EOF)返回false
  // while (std::cin.get(c) && c != '\032') // 一参数，读取成功返回非0值，读取失败(如遇到EOF)返回false

  // {
  //   str[i] = c;
  //   i++;
  //   std::cout.put(c);
  // }

  // str[i] = c;

  // std::cout << "c1 : " << c1 << std::endl;

  /**
   * 键入回车时，输入'\n'并准备结束本次输入
   * 先判断本次输出流内是否有结束符，有提前结束输入，无一直找，流中有n-1个字符吗？有，结束输出，无，不结束本次输入,接着输
  */
  // std::cin.get(str, 20);      // 从输入流中读取20-1个字符，如果遇到默认结束符'\n',提前结束读取。如果提取成功返回非0值 ，提取失败（如遇到文件结束符）则返回0;
  // std::cin.get(str, 5);      // 内部调的是三参，传'\n' ，12\ n-> 12
  // std::cin.get(str, 5, '\n'); // 自定义结束符'\n'，12\n -> 12
  // std::cin.get(str, 5, '\t'); // 自定义结束符'\t'，

  // std::cout << "str : " << str << std::endl;
  // std::cin.seekg(0, std::ios::beg);
  // std::cin.setf(std::ios::skipws);
  // std::cin >> c;
  // std::cout << "c : " << c << std::endl;

  // ---get连用问题---------------
  /**
   * 回车，输入'\n'并准备结束本次输出
  */

  /**
  // std::cin.get(str, 5, '\\');// 回车，键入'\n'，提取n-1个字符，如果遇到'\\'提前结束，不读取'\\',当前流指针位置'\\'
  std::cin.get(str, 5, '\n'); // 回车，键入'\n'，提取n-1个字符，如果遇到'\n'提前结束，不读取'\n',当前流指针位置'\n'
  std::cout << "str : " << str << std::endl;
  // std::cin.get(str, 5, '\\');
  std::cin.seekg(1, std::ios::beg);
  std::cin.get(str, 5, '\n');
  std::cout << "str : " << str << std::endl;
  // 指针在第二个结束符'\n'那里。
  // std::cin.seekg(0,std::ios::beg);// 手动移到开头，把上一个\n也拿过来
  // std::cin.seekg(-1, std::ios::cur); // 手动移到开头，把上一个\n也拿过来?? 上一个回车哪去了？？？
  std::cin.get(str, 5, '\t');
  std::cout << "str : " << str << std::endl;
  */

  /**
   * getline使用
  */
  // std::cin.getline(str,5); // 内部调3参的，传'\n'; 123\n -> 123
  // std::cin.getline(str,5,'\n');// 123\n -> 123
  // std::cin.getline(str,5,'\t');// 1\n3\t -> 1\n3
  // std::cout << "str : " << str << std::endl;

  /**
   * getline连用
   * 
   * 结束符'\t'
   * 
   * 123\t\n -> 123;  123\t\n-> 123;
   * 123\t456\n -> 123; \t78\t\n-> 456;
   * 
   * 123\t\n -> 123; 456\t\n -> \n456 ; 789\t\n -> \n789;
  */

  /**
  std::cin.getline(str, 5, '\t');
  std::cout << "str : " << str << std::endl;
  std::cin.getline(str, 5, '\t');
  std::cout << "str : " << str << std::endl;
  // std::cin.getline(str, 5, '\t');
  // std::cout << "str : " << str << std::endl;

  std::cin.seekg(0, std::ios::beg);
  std::cin.unsetf(std::ios::skipws);
  // 流里面的两个\t 和一个\n 没了？？？？
  // std::cout << "read remainer" << std::endl;
  char ch;
  std::cin >> ch;
  std::cout << "ch:" << ch << std::endl;
  while (std::cin.get(ch))
  {
    std::cout.put(ch);
  }
  */

  /**
   * cin>> 和 cin.get/cin.getline比较
   * 
   * 1. cin>> 遇到空白符截终止，get和getline可以读空白符
   * 2. cin可以输入各种类型数据，重载后还能输出用户自定义数据，get、getline只能输入字符型数据
  */

  /**
   * cin.eof()
  */

  /**
  // 直接输入^Z     -1 '\377' EOF
  // 字符串中的^Z   26 '\032'
  while (!std::cin.eof())
  {
    if ((c = std::cin.get()) != ' ')
    {
      std::cout.put(c);
    }
  }
  */

  /**
   * cin.peek
   * 
   * 流中无数据是,c = cin.peek()等待键入数据，输入结束，指针位置0，
   * 12 34\n -> 1
   * 
   * 观测下一个字符，指针不会改变
   * 1 2 3\n -> c:1 peek->' '; peek->' ';
   * 
   * seekg();会清空流数据？？
  */

  /**
  // c = 'X';
  // c = std::cin.peek();
  // std::cout << "c : " << c << std::endl;

  std::cin.get(c);
  std::cout << "c : " << c << std::endl;
  c = std::cin.peek();
  std::cout << "c : " << c << std::endl;
  std::cin.seekg(0, std::ios::beg);// 指针移动流清空了？？
  c = std::cin.peek();
  std::cout << "c : " << c << std::endl;
  */

  /**
   * cin.putback() 将字符返回输入流
   * enter: qwer123/456789\n -> str:qwer123 -> c = cin.peek(); c:'4' -> cin.putback('q'); c = cin.peek(); c:'q' -> enter:0/\n->str:q456789\n0
  */

  /**
  c = 'X';
  strcpy(str, "");

  std::cout << "please enter a sentence:";
  std::cin.getline(str, 15, '/');
  std::cout << "str:" << str << std::endl;
  c = std::cin.peek();
  std::cout << "c:" << c << std::endl;
  std::cin.putback(str[0]);
  c = std::cin.peek();
  std::cout << "c:" << c << std::endl;
  std::cout << "please enter a sentence:";
  std::cin.getline(str, 15, '/');
  std::cout << "str:" << str << std::endl;
  */

  /**
   * cin.ignore()函数
   * cin.ignore(n,ch); 跳过流中n个字符，如果遇到ch提前结束,包括忽略ch
   * 默认值 cin.ignore(1,EOF);
   * 
   * enter:123/456/789\n-> cin.get(str,100,'/'); str:123 -> cin.ignore(); cin.get(str,100,'/'); str:456
   * 
   * enter:123/456/789/012\n-> cin.get(str,100,'/'); str:123 -> cin.ignore(5,'\\'); cin.get(str,100,'/'); str:789
   * 
   * enter:123/456/789\n-> cin.get(str,100,'/'); str:123 -> cin.ignore(5,'/'); cin.get(str,100,'/'); str:456
  */

  /**
  std::cout << "please enter a sentence:";
  std::cin.get(str, 100, '/');
  std::cout << "The part A:" << str << std::endl;

  std::cin.ignore();
  // std::cin.ignore(5, '\\');
  // std::cin.ignore(5, '/');

  std::cin.get(str, 100, '/');
  std::cout << "The part B:" << str << std::endl;
  */

  /**
   * getline()函数
   * getline(std::iostream &,std::string str,char ch);
   * 全局函数？？原来C的方法，不用std::getline调也可以.
   * 个数限制不了？？
   * 有点像 cin.getline()
   * 
   * getline(cin,s1,'/')-> enter:123/456/789\n -> s1:123 -> c = cin.peek(); c:'4' -> getline(cin,s1,'/'); s1:456 -> getline(cin,s1,'/'); enter:0/\n -> s1-> 789\n0
  */
  std::string s1; // 注意！！！！！！
  c = 'x';
  // std::getline(std::cin, s1);// std:: 加不加都行.
  // getline(std::cin, s1);// 默认调三参的,第三参默认值'\n'

  getline(std::cin, s1, '/');
  std::cout << "s1:" << s1 << std::endl;
  c = std::cin.peek();
  std::cout << "c:" << c << std::endl;
  s1 = "";
  getline(std::cin, s1, '/'); // 有点像std::cin.getline
  std::cout << "s1:" << s1 << std::endl;
  s1 = "";
  getline(std::cin, s1, '/'); // 有点像std::cin.getline
  std::cout << "s1:" << s1 << std::endl;

  printf("------------end---------------\n");
  return 0;
}